package Views;

import static Enums.BeestType.CARNIVOOR;
import static Enums.BeestType.HERBIVOOR;
import static Enums.BeestType.NONIVOOR;
import static Enums.BeestType.OMNIVOOR;
import Models.Beest;
import Models.Leefgebied;
import Models.Obstakel;
import Models.Plant;
import Models.WereldModel;
import java.awt.Color;
import java.awt.Graphics;
import java.util.Observable;
import java.util.Observer;

/**
 *
 * @author Bart Janisse
 */
public class WereldView extends javax.swing.JPanel implements Observer
{
    WereldModel wereldModel;
     
    /**
     * maak een nieuwe form WereldView
     * Doordat de WerledView Observer implementeerd zal deze bij een verandering
     * worden geupdate.
     */
    public WereldView() {
        initComponents();
        this.setBackground(Color.blue);
    }
    
    /**
     * Deze methode zorgt voor alle teken bewerkingen. De verplaatsing van 
     * beesten op hetscherm etc.
     */
    @Override
    protected void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        
        //tekenLeefgebied(g, 110, 110);
       // tekenLeefgebied(g, 750, 110);
        
        if(wereldModel != null)
        {
            int i = 0;
            for(Leefgebied leefgebied: wereldModel.getLeefgebieden())
            {           
                tekenLeefgebied(g, leefgebied.getTopX(), leefgebied.getTopY());
                int offsetX = leefgebied.getTopX() * 4;
                int offsetY = leefgebied.getTopY() * 2;
                // In het leefgebied hebben alle objecten een relatieve positie.
                // Dus t.o.v. de linker bovenhoek van het leefgebied
                for(Obstakel obstakel: leefgebied.getObstakels())
                {
                    int X = obstakel.getX();
                    int Y = obstakel.getY();   
                    tekenObstakel(g, X * 4 + offsetX, Y * 2 + offsetY );
                }
                
                for(Plant plant: leefgebied.getPlanten())
                {
                    int X = plant.getX();
                    int Y = plant.getY();   
                    tekenPlant(g, X * 4 + offsetX, Y * 2 + offsetY );
                }
                
                for(Beest beest: leefgebied.getBeesten())
                {
                    int X = beest.getPositie().getX();
                    int Y = beest.getPositie().getY();
                    
                    Color kleur;
                    
                    switch(beest.getType())
                    {
                        case CARNIVOOR : kleur = Color.RED;
                                         break;
                        case OMNIVOOR  : kleur = Color.YELLOW;
                                         break;
                        case HERBIVOOR : kleur = new Color(182,122,87);
                                         break;
                        case NONIVOOR  : kleur = new Color(163,73,164);
                                         break;
                        default: kleur = Color.BLACK;
                    }
                    tekenBeest(g, kleur, X * 4 + offsetX, Y * 2 + offsetY );
                }
                i++;   
            }
            
            for(Beest beest: wereldModel.getWater())
            {
                int X = beest.getPositie().getX();
                int Y = beest.getPositie().getY();

                Color kleur;

                switch(beest.getType())
                {
                    case CARNIVOOR : kleur = Color.RED;
                                     break;
                    case OMNIVOOR  : kleur = Color.YELLOW;
                                     break;
                    case HERBIVOOR : kleur = new Color(182,122,87);
                                     break;
                    case NONIVOOR  : kleur = new Color(163,73,164);
                                     break;
                    default: kleur = Color.BLACK;
                }
                
                tekenBeest(g, kleur, X * 4, Y * 2);
            }
        }

    }
      
    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 903, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 385, Short.MAX_VALUE)
        );
    }// </editor-fold>//GEN-END:initComponents
    // Variables declaration - do not modify//GEN-BEGIN:variables
    // End of variables declaration//GEN-END:variables

    /**
     * Herteken het scherm indien de update  wordt aangesproken. Deze update is 
     * onderdeel van het MVC model.
     * @param o
     * @param arg 
     */
    @Override
    public void update(Observable o, Object arg) 
    {
        wereldModel = (WereldModel)o;
        this.repaint();            
    }
    
    /**
     * Tekenet een witte rechthoek op het scherm die een leefgebied moet
     * voorstellen
     * @param g
     * @param posX (linker boven hoek van het leefgebied)
     * @param posY (linker boven hoek van het leefgebied)
     */
    private void tekenLeefgebied(Graphics g, int posX, int posY)
    {
        g.setColor(Color.WHITE);
        g.fillRect(posX * 4, posY * 2, 100 * 4, 200 * 2);   
    }
    /**
     * Teken een beest op het scherm met de gegeven parameters
     * @param g
     * @param color
     * @param posX
     * @param posY 
     */
    private void tekenBeest(Graphics g, Color color, int posX, int posY)
    {
        g.setColor(color);
        g.fillRect(posX, posY, 5, 5);
    }
    
    /**
     * Teken een plant op het scherm met de gegeven parameters
     * @param g
     * @param posX
     * @param posY 
     */
    private void tekenPlant(Graphics g, int posX, int posY)
    {
        g.setColor(Color.GREEN);
        g.fillRect(posX, posY, 5, 5);
    }
    
    /**
     * Teken een obstakel op het scherm met de gegeven parameters.
     * @param g
     * @param posX
     * @param posY 
     */
    private void tekenObstakel(Graphics g, int posX, int posY)
    {
        g.setColor(Color.BLACK);
        g.fillRect(posX, posY, 5, 5);
    }
}
